package org.bite.lesson02;

import java.io.*;
import java.util.Scanner;

public class Demo209_Copy {
    public static void main(String[] args) throws IOException {
        //1.获取用户源文件路径
        System.out.println("请输入源文件路径：");
        Scanner scanner = new Scanner(System.in);
        //获取用户输入
        String sourcePath = scanner.next();
        //2.校验文件是否符合要求
        File sourceFile = new File(sourcePath);
        //是否存在
        if(!sourceFile.exists()){
            System.out.println("输入的源文件不存在");
            return;
        }
        //是否普通文件
        if(!sourceFile.isFile()){
            System.out.println("输入的源文件不是一个普通文件");
            return;
        }
        //3.用户输入目标文件
        System.out.println("请输入目标文件路径：");
        String destPath = scanner.next();
        //创建一个文件对象
        File destFile = new File(destPath);
        //是否存在
        if(destFile.exists()){
            System.out.println("目标文件已存在，请重新输入");
            return;
        }
        //判断父目录是否存在
        if(!destFile.getParentFile().exists()){
            System.out.println("目标路径父目录不存在");
            return;
        }

        scanner.close();
//        //实现读写操作，定义输入流、输出流
//        FileInputStream inputStream = new FileInputStream(sourceFile);
//        FileOutputStream outputStream = new FileOutputStream(destFile);
//
//        //关闭流
//        inputStream.close();
//        outputStream.close();


        /*InputStream和OutputStream都是Closeable接口的间接实现。
        在Java中，当使用try-with-resources语句时，任何实现了java.lang.AutoCloseable接口
        （或其子接口java.io.Closeable）的资源都会在try块执行完毕后自动关闭。
        这是为了确保资源（如文件、数据库连接等）在使用完毕后能够被正确释放，从而避免资源泄露*/
        try(InputStream inputStream = new FileInputStream(sourceFile);
        OutputStream outputStream = new FileOutputStream(destFile)){
            //定义一个数组
            byte[] bytes = new byte[1024];
            //循环读取文件
            while(true) {
                //读取
                int len = inputStream.read(bytes);
                if(len == -1){
                    break;
                }
                //把读到的内容写入目标文件
                outputStream.write(bytes,0,len);
            }
            //强制刷新系统缓冲区
            outputStream.flush();
            System.out.println("复制成功："+sourcePath+"--->"+destPath);
        }catch(IOException e){
            throw new RuntimeException(e);
        }
    }
}
